home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / msds-prl / ptchds19.zoo / moredos_asm < prev    next >
Text File  |  1992-02-23  |  7KB  |  253 lines

  1. MS-DOS patches to perl.
  2. Apply this patch to the standard perl source, version 4, patch level 19,
  3. using "patch -p."  Do this in the root directory of the perl source
  4. distribution.
  5.  
  6. You can cat all these patches together and pipe the output to patch -p.
  7.  
  8. Len Reed
  9. Holos Software, Inc.
  10. ..!gatech!holos0!lbr
  11. holos0!lbr@gatech.edu
  12. --------------------------------------
  13. *** msdos/moredos.asm.old    Sun Feb 23 08:48:16 1992
  14. --- msdos/moredos.asm    Thu Nov 14 08:56:36 1991
  15. ***************
  16. *** 0 ****
  17. --- 1,235 ----
  18. + ; Various stuff that has to be in assembly langauge because the
  19. + ; C library under DOS won't do what we need.
  20. + ; Copyright (c) 1990 Leonard Reed.
  21. + ; Author: ...!gatech!holos0!lbr
  22. + ; This program is free software; you can redistribute it and/or
  23. + ; modify it under the terms of the GNU General Public License
  24. + ; (version 1), as published by the Free Software Foundation, and
  25. + ; found in the file 'LICENSE' included with this distribution.
  26. + ; This program is distributed in the hope that it will be useful,
  27. + ; but WITHOUT ANY WARRANTY; without even the implied warrant of
  28. + ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  29. + ; GNU General Public License for more details.
  30. + ; You must assemble this file with masm flag
  31. + ;    -dmmodel where model is one of {small, compact, medium, large}
  32. + ;
  33. + ifdef msmall
  34. +         .model    small
  35. +   ARG    equ    4
  36. + endif
  37. + ifdef mcompact
  38. +     .model  compact
  39. +   ARG    equ    4
  40. + endif
  41. + ifdef mmedium
  42. +     .model    medium
  43. +   ARG    equ    6
  44. + endif
  45. + ifdef mlarge
  46. +     .model    large
  47. +   ARG    equ    6
  48. + endif
  49. + .data
  50. +     extrn __psp:word        ; our PSP, set by C library startup code
  51. +     extrn _errno:word        ; C library Unix-like error code
  52. +     extrn __osversion:word    ; MS-DOS version, set by C library startup
  53. + SFT_block    Struc        ; header for s system file table block
  54. + d_next        dd    ?    ; pointer to next block, or ????:ffffh for end
  55. + d_count        dw    ?    ; num of system file table entries in this block
  56. + SFT_block    Ends
  57. + .code
  58. + ; struct sft far * dos_sys_file(int handle);
  59. + ; Return a pointer to the system file table entry for a given file handle.
  60. + ; This routine returns zero for success and NULL (with errno set) for failure.
  61. + ; We resolve the file handle to a system file table entry and
  62. + ; change the value there.  This requires knowledge of DOS's internals
  63. + ; that is widely know but not "documented" by Microsoft.
  64. + ; Refer to _The Waite Group's MS-DOS Developer's Guide_, 2nd edition,
  65. + ; Howard Sams & Co., pp. 210-217.
  66. +     Public _dos_sys_file
  67. + _dos_sys_file Proc
  68. +     push bp
  69. +     mov bp,sp
  70. +     push di
  71. +     mov es,__psp    ; our program segment prefix
  72. +     mov ax,es:[32h]    ; size of our job file table (max num of handles)
  73. +     mov bx,[bp+ARG]    ; get the file handle passed to this routine
  74. +     cmp bx,ax
  75. +     jae bad_handle    ; bad handle, possibly 0ffffh from failed open()
  76. +     les di,es:[34h]    ; address of the job file table (typically just es:18h)
  77. +     mov bl,es:[bx+di]    ; get system file table entry for this handle
  78. +     cmp bl,0ffh        ; is the entry used?
  79. +     je bad_handle
  80. +     mov dl,bl        ; save the system file table entry momentarily in DX
  81. +     sub dh,dh
  82. +     mov ah,52h        ; "undocumented" call to get ptr to list of lists
  83. +     int 21h        ; pointer returned in ES:BX
  84. +     les di,es:[bx+4]    ; get pointer to first SFT_block
  85. +     mov ax,dx        ; index of entry sought
  86. + ; Now have ES:DI ==> first SFT_BLOCK
  87. + ;       AL == AX == system file table number for the given handle
  88. +     sub bx,bx
  89. + new_block:
  90. +     add bx,es:[di].d_count    ; set BX to first sys file number in next block
  91. +     cmp ax,bx            ; is the sought number in this block?
  92. +     jl found_it
  93. +     
  94. +     cmp di,0ffffh        ; at end of chain ?
  95. +     je bad_handle        ; didn't find it: really is worse than EBADF!
  96. +     les di,es:[di].d_next    ; pointer to next block
  97. +     jmp new_block
  98. + found_it:
  99. +     sub bx,es:[di].d_count    ; sys file number of 1st SFN this block
  100. +     sub ax,bx            ; offset of sought sys file number's entry
  101. +     mov bx,__osversion        ; test DOS version
  102. +     cmp bl,4
  103. +     mov bl,3bh            ; assume 4.x/5.x structure size
  104. +     jae its_dos_4
  105. +     mov bl,35h            ; before 4.0, structures were smaller
  106. + its_dos_4:
  107. +     mul bl            ; set AX to offset (almost) into block
  108. +     add ax,size SFT_block    ; add the header size
  109. +     add ax,di            ; add the offset of the block
  110. +     mov dx,es            ; now DX:AX points to the sought entry
  111. +     jmp short get_out
  112. + bad_handle:
  113. +     mov _errno,9    ; EBADF
  114. +     sub ax,ax
  115. +     mov dx,ax
  116. + get_out:
  117. +     pop di
  118. +     pop bp
  119. +     ret
  120. + _dos_sys_file Endp
  121. + ; Routine to return maximum number of files, similar to Unix NOFILE.
  122. + ; Ususally under dos this is 20, but it can be changed.
  123. + ; int dos_get_nofiles(void);
  124. +     Public _dos_get_nofiles
  125. + _dos_get_nofiles Proc
  126. +     mov es,__psp    ; our program segment prefix
  127. +     mov ax,es:[32h]    ; size of our job file table (max num of handles)
  128. +     ret
  129. + _dos_get_nofiles Endp
  130. + ; Routine to return pointer to the file table that maps handles
  131. + ; to system files.  Usually in PSP at offset 18h, but can be remapped.
  132. + ; unsigned char far * dos_get_sft_map(void);
  133. +     Public _dos_get_sft_map
  134. + _dos_get_sft_map Proc
  135. +     mov es,__psp    ; our program segment prefix
  136. +     les ax,es:[34h]    ; address of the job file table (typically just es:18h)
  137. +     mov dx,es        ; return pointer in DX:AX
  138. +     ret
  139. + _dos_get_sft_map Endp
  140. + ; Duplicate a handle bypassing the C library
  141. + ; Used by spawn logic to control inheritance without confusing the
  142. + ; C library about O_BINARY/O_TEXT, I/O modes, etc.
  143. + ; int dos_dup(int);
  144. +     Public _dos_dup
  145. + _dos_dup Proc
  146. +     push bp
  147. +     mov bp,sp
  148. +     mov bx,[bp+ARG]
  149. +     mov ah,45h
  150. +     int 21h
  151. +     jc dup_failure
  152. +     pop bp
  153. +     ret
  154. + dup_failure:        ; also jumped to from _dos_dup2
  155. +     cmp ax,6h        ; Is DOS trying to say EBADF (bad handle?)
  156. +     je dup_bad_handle
  157. +     mov ax,24        ; assume EMFILE, out of files or handles
  158. +     jmp short dup_error_exit
  159. + dup_bad_handle:
  160. +     mov ax,9    ; EBADF, bad file handle
  161. + dup_error_exit:
  162. +     mov _errno,ax
  163. +     mov ax,-1
  164. +     pop bp
  165. +     ret
  166. + _dos_dup Endp
  167. + ; Duplicate a handle to a specific new handle, bypassing the C library.
  168. + ; Used by spawn logic to control inheritance without confusing the
  169. + ; C library about O_BINARY/O_TEXT, I/O modes, etc.
  170. + ; int dos_dup2(int current, int duplicate);
  171. +     Public _dos_dup2
  172. + _dos_dup2 Proc
  173. +     push bp
  174. +     mov bp,sp
  175. +     mov bx,[bp+ARG]
  176. +     mov cx,[bp+ARG+2]
  177. +     mov ah,46h
  178. +     int 21h
  179. +     jc dup_failure    ; see _dos_dup code
  180. +     pop bp
  181. +     ret
  182. + _dos_dup2 Endp
  183. + ; Close a handle without telling the C runtime library.
  184. + ; Used by spawn logic to control inheritance without confusing the
  185. + ; C library about O_BINARY/O_TEXT, I/O modes, etc.
  186. + ; int dos_close(int handle);
  187. +     Public _dos_close
  188. + _dos_close Proc
  189. +     push bp
  190. +     mov bp,sp
  191. +     mov bx,[bp+ARG]
  192. +     mov ah,3eh
  193. +     int 21h
  194. +     mov ax,0        ; no error (note this doesn't affect CF)
  195. +     jnc closed_it
  196. +     mov _errno,9    ; EBADF (this is a guess, we could inspect AX)
  197. +     mov ax,-1
  198. + closed_it:
  199. +     pop bp
  200. +     ret
  201. + _dos_close Endp
  202. +     End
  203.